package cn.demoncat.util.lang.entity;

import java.util.LinkedHashMap;
import java.util.Map;

import cn.demoncat.util.exception.ParamRuntimeException;
import cn.demoncat.util.lang.StringUtil;

/**
 * LinkedHashMap<String,String>
 * 
 * 注意：对于num类型的键，即使是字符串类型，在前端也会以数字排序Map
 * 
 * @author 延晓磊
 *
 * @since 2018年8月31日
 */
public class LinkedMapSs extends LinkedHashMap<String, String>{
 
	private static final long serialVersionUID = 1L;

	/**
	 * 空，不可变
	 */
	public static final Map<String, String> EMPTY = new LinkedMapSs();
	
	/**
	 * 实例化
	 * 
	 * @param kvs	键,值,键,值...
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年11月21日
	 */
	public static LinkedMapSs getInstance(String ...kvs) {
		LinkedMapSs map = new LinkedMapSs();
		if (kvs != null && kvs.length > 0) {
			if (kvs.length % 2 != 0) {
				throw new ParamRuntimeException("参数必须是多组键值对");
			}
			for (int i = 0; i < kvs.length; i += 2) {
				map.put(kvs[i], kvs[i+1]);
			}
		}
		return map;
	}
	
	/**
	 * 添加
	 * 
	 * @param kvs	k,v,k,v...
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年2月17日
	 */
	public LinkedMapSs add(String ...kvs) {
		if (kvs != null && kvs.length > 0) {
			if (kvs.length % 2 != 0) {
				throw new ParamRuntimeException("参数必须是多组键值对");
			}
			for (int i = 0; i < kvs.length; i += 2) {
				this.put(StringUtil.toString(kvs[i]), kvs[i+1]);
			}
		}
		return this;
	}
	
	/**
	 * 添加
	 * 
	 * @param put	是否添加
	 * @param kvs	k,v,k,v...
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年2月17日
	 */
	public LinkedMapSs or(boolean put, String ...kvs) {
		return put ? this.add(kvs) : this;
	}
	
	/**
	 * 添加
	 * 
	 * @param map
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年2月17日
	 */
	public LinkedMapSs addAll(Map<String,String> map) {
		this.putAll(map);
		return this;
	}
}
